//
//  WBHomeViewModel.swift
//  SinaWeibo
//
//  Created by 风不会停息 on 2016/11/17.
//  Copyright © 2016年 风不会停息. All rights reserved.
//

import UIKit
import YYModel
import SDWebImage
class WBHomeViewModel: NSObject {

    lazy var viewmodelArr: [WBStatusViewModel] = [WBStatusViewModel]()
    
    //专门加载数据的方法 不负责和UI打交道   将数据传递给外面
    func loadData(isPullup:Bool,finished: @escaping (Bool,Int) -> ()) {
        let urlString = "https://api.weibo.com/2/statuses/home_timeline.json"
        var maxId: Int64 = 0
        var sinceId: Int64 = 0
        
        ///专门加载数据的方法 不负责和UI界面打交道
        ///
        /// - Parameters:
        ///   - isPullup: 是否正在上拉操作
        ///   - finished: 请求的回调
        if isPullup {
            //上拉
            maxId = viewmodelArr.last?.status?.id ?? 0
            if maxId != 0 {
                maxId -= 1
            }
        } else {
            sinceId = viewmodelArr.first?.status?.id ?? 0
        }
        
        let parameters = ["access_token" : WBUserAccountViewModel.WBUserAccountShared.access_token,
                          "max_id" : "\(maxId)",
            "since_id" : "\(sinceId)"]
        WBNetWorkTools.tool.request(method: .GET, urlString: urlString, parameter: parameters) { (responseObject, error) in
            if error != nil {
                print(error)
                return
            }
            //解析数据 ,转换为模型数据
            //需要将Any? 转换为[String : Any]
            let dict = responseObject as! [String : Any]
            //尝试转换为字典类型的数组
            guard let array = dict["statuses"] as? [[String : Any]] else {
//                SVProgressHUD.showError(withStatus: "出错啦")
                return
            }
            var tempArray = [WBStatusViewModel]()
            for item in array {
                
                let viewmodel = WBStatusViewModel()
                let s = WBStatus()
//                let ad = WBStatus()
                //调用对象的YYModel种扩充的对象方法传入字典 --> 模型数据
                s.yy_modelSet(with: item)
                //给viewmodel的status赋值
                viewmodel.status = s
                //添加到一个临时数组中  获取数据都是按页一次获取20条数据
                tempArray.append(viewmodel)
            }
            //执行成功的回调
            if isPullup {
                //上拉加载更多数据 追加
                self.viewmodelArr = self.viewmodelArr + tempArray
            } else {
                //初次的时候直接赋值 或者 下拉刷新的时候 执行插入到前面操作
                self.viewmodelArr = tempArray + self.viewmodelArr
            }
            //在这里执行回调能够确保单张图片下载完毕吗?
            //self.cacheStatusSingleImage(array: tempArray)
            //finished(true,tempArray.count)
            self.cacheStatusSingleImage(array: tempArray, finished: finished)
        }
        
        
        
    }
    
    
    //缓存单张图片
    private func cacheStatusSingleImage(array: [WBStatusViewModel],finished: @escaping (Bool,Int) -> ()) {
        if array.count == 0 {
            //一定要执行回调
            finished(true, 0)
            return
        }
        
        //遍历视图模型
        //使用调度组
        let group = DispatchGroup()
        for viewmodel in array {
            if viewmodel.imageUrls?.count == 1 {
                //只有一张图图片
                //执行下载图片的操作
                //异步任务 希望所有的异步任务执行完毕之后再执行回调
                //在开始异步任务之前 执行入组的操作 ,调度组中的异步任务 + 1
                group.enter()
                let url = URL(string: viewmodel.imageUrls?.first?.wap360 ?? "")
                SDWebImageManager.shared().downloadImage(with:url, options: [], progress: nil, completed: { (_, _, _, _, _) in
//                    print("----单张图片下载成功")
                    //
                    //finished(true, array.count)
                    //出组, 标识调度组中的异步任务 -1
                    group.leave()
                })
            }
        }
        //执行统一的回调
        group.notify(queue: DispatchQueue.main, execute: {
//            print("----所有的单张图片都下载完毕")
            finished(true, array.count)
        })
    }
}
